#include <stdio.h>
#include <stdlib.h>	/* exit() */
#include <string.h>
#include <pthread.h>
#include <sys/time.h>
#include <time.h>
#include <limits.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>


/*
 * vfork 函数示例
 */


int glob = 6;	/* external variable in initialized data */

int main(void)
{
	int var;	/* automatic variable on the stack */
	pid_t pid;

	var = 88;

	printf("before fork\n");	/* we don't flush stdout */

	if (( pid = vfork()) < 0) 
		perror("vfork error");
	else if (pid == 0) {	/* child */
		glob++;				/* modify parent's variables */
		var++;
		_exit(0);
	}

	/* parent continues here */
	printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);

	exit(0);
}

/*

result:

 pid = 3270, glob = 7, var = 89

vfork 保证了在子进程调用 exec and exit 之前,内核会使父进程处于休眠状态.

子进程对变量glob and var 做增1操作,结果改变了父进程中的变量值.因为子进程在父进程的地址空间
中运行,所以这并不令人惊讶.但是其作用的确与 fork 不同.

*/
